home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / comm / fido / SHE950425.lha / rexx / Browse.rexx next >
OS/2 REXX Batch file  |  1995-04-25  |  43KB  |  1,173 lines

  1. /**/
  2. v="$VER: Browse  Rexx FileList Browser Williamson 55.77"
  3. pview="PPDC"            /* Viewer for PowerPacked files */
  4. tview="PPDC"            /* Viewer for plain text files  */
  5. tview="MoreText"        /* Viewer for plain text and AmigaGuide files  */
  6. search="Search NONUM"   /* FileList Search command */
  7. SinceLimit=36           /* Number of days back allowed for NewFiles,NewSince */
  8. TimeLimit=15            /* Number of Browsing minutes allowed */
  9. InputTimeout=45         /* Number of seconds to wait for user input */
  10. MaxTimeouts=4           /* Maximun number of user timeouts permitted */
  11. fileslist='MAIL:FILELISTS/01670104.LST'
  12. freqlist='RAM:FREQ.LST' /* file request list */ 
  13. config="CFG:Browse.CFG" /* file area config */
  14. NOLIST='~(area.text|files.bbs|LZTEMP.#?|.info)'
  15. LISTFMT='"%-20N%7L %-9D %C"';FLLEN=77;MARGINALL=45
  16. ARCFMT='"%P%N %L %D %C"';FLLEN=77;MARGINALL=45
  17. ext="LST"Pragma('ID')
  18. tmpbbs="T:M"ext
  19. tmparc="T:X"ext
  20. tmpnew="T:N"ext
  21. tmpsch="T:S"ext
  22. matchlist="T:V"ext
  23. newall="T:ALST_BROWSE"
  24. temp="ram:"
  25. tmplst="T"ext
  26. script="File Stack Browser";sv="v"||right(v,5)
  27. bel='07'x;lf='0a'x;NL='0d'x||'0a'x;cls='0C'x||'0A'x;quote='"'
  28. stacked=0;cstack="";ucmd="";x=""
  29. NumString=2;OneChar=1;OneWord=0;AddCmd=1;DelCmd=0;arclevel=0
  30. direction.0="REVERSE";direction.1="FORWARD"
  31. timeouts=0;timeup=0;notgrab=0
  32. log=show('p','ROOFLOG')
  33. if ~show("L", "rexxsupport.library") then
  34.     if ~addlib("rexxsupport.library", 0, -30, 0) then do
  35.             say "Couldn't access rexxsupport.library !"
  36.             exit 20
  37.     end
  38. if ~show("L", "rexxdossupport.library") then
  39.     if ~addlib("rexxdossupport.library", 0, -30, 0) then do
  40.             say "Couldn't access WB2 rexxdossupport.library !"
  41.             exit 20
  42.     end
  43.  
  44. options results
  45. options failat 20
  46. numeric digits 14
  47. signal on halt
  48. signal on ioerr
  49. signal on break_c
  50. signal on break_d
  51.  
  52. archandler=showlist('h',"ARC")
  53. inarc=0
  54. if arg()=0 then do
  55.     debug=1
  56.     ansi=1;expert=1;screen=20;page=40
  57.     username="Beta Tester";bytelimit=1440000
  58.     call open('bd','CON:1000/0/250/250/Browse Debug/AUTO/CLOSE/WAIT','w')
  59. end;else do
  60.     debug=0
  61.     ansi=1;expert=1;screen=20;page=40
  62. /*    ansi=1;expert=0;screen=10;page=20 */
  63.     baseport=GetClip('SHELTER')
  64.     if baseport="ROOF" then envpath="";else envpath=baseport"/"
  65.     auxdev=GetVar(envpath||'AUXDEV',"G")
  66.     auxmount=GetVar(envpath||'AUXMOUNT',"G")
  67.     devname=delstr(auxdev,pos(":",auxdev))
  68.     if ~showlist("H",devname) then do
  69.         options failat 99999
  70.         ADDRESS COMMAND auxmount
  71.         options failat 20
  72.     end
  73.     parse arg baud port bytelimit username
  74.     Address VALUE baseport||port
  75.     'String $(device) $(unit) $(locked) $(baudlocked)'
  76.     parse var RESULT device unit locked baudlocked .
  77.     if locked="TRUE" then redirect=GetVar(envpath||'AUXDIRECT',"G")||strip(device)'/'strip(unit)'/con/shared/checkcd/speed'||strip(baudlocked)
  78.     else redirect=GetVar(envpath||'AUXDIRECT',"G")||strip(device)'/'strip(unit)'/con/shared/checkcd/speed'||strip(baud)
  79. end
  80. uname=""
  81. do i=1 to words(username)
  82.     if datatype(word(username,i),'N') then do
  83.         notgrab=1;iterate
  84.     end
  85.     uname=uname||word(username,i)" "
  86. end
  87. username=strip(uname);drop uname
  88. if ~exists(freqlist) | ~exists(fileslist) | ~exists(config) then do
  89.     call Send(' Sorry, 'username' the sysop has not yet configured Browse'bel||NL)
  90.     signal cleanup
  91. end
  92. if ~open('dlst',config, 'R') then do
  93.     call send(" SYSTEM ERROR: Couldn't open fileareas list" config||bel||NL)
  94.     signal cleanup
  95. end
  96. CSI='1b'x||'[';AOFF=CSI||'0m';BOLD=CSI||'1m';ITALICS=CSI||'3;40m'
  97. invalid=" Invalid command"bel||NL
  98. nomarks=" There are no files marked for download"NL
  99. call send(cls||ITALICS" "script sv||AOFF||NL||BOLD" by Robert Williamson 1:167/104.0@fidonet"AOFF||NL)
  100.  
  101. sincedate=0;markedbytes=0;marks=0;mlist="";blist="";plist="";days=""
  102.  
  103. call send(' Welcome to 'script', 'username||NL)
  104. if archandler then call send(' ARChandler active!'NL||NL)
  105.  
  106. if ~debug then call main_help()
  107. call send(' Reading file area configuration.')
  108. area=1
  109. do while ~eof('dlst')
  110.     call send('.')
  111.     ln=strip(readln('dlst'))
  112.     if ln="" then iterate
  113.     parse var ln Number.area '"' Path.area '"' '"' Name.area '"' .
  114.     area=area+1
  115. end /*eof*/
  116. call close('dlst')
  117. areas=area-1
  118. call send(NL' Found 'areas' file areas'NL)
  119. call send(' Browse Timer started'NL);call time('r')
  120. maincmd:
  121. if stacked then x=popstack(OneChar)
  122. else do
  123.     if expert then ucmd=uprompt(NL||BOLD ,
  124.         ||" [A]reas      [S]earch    [N]ewfiles   [E]xit"NL ,
  125.         ||" [D]ownload   [C]hange    [H]elp       Select Area: "AOFF)
  126.     else do
  127.         call help_m('novice')
  128.         ucmd=uprompt(BOLD" Command: "AOFF)
  129.     end
  130.     stacked=pushstack(ucmd,AddCmd)
  131.     if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  132. end    
  133. if x="|" then x="|"
  134. if x="D" then signal download
  135. else if x="S" then call searchlist(pushstack(ucmd,DelCmd))
  136. else if x="C" then do
  137.     call changeopt(pushstack(ucmd,DelCmd))
  138.     call send(cls)
  139. end;else if x="N" then do
  140.     call newsinceall(pushstack(ucmd,DelCmd))  
  141.     call send(cls)
  142. end;else if x="H" then do
  143.     call help_m()
  144.     call send(cls)
  145. end;else if x="E" then do
  146.     if marks>0 then signal download
  147.     else signal nomarkexit
  148. end;else if datatype(x,"N") then do
  149.     call showarea(x)
  150.     signal maincmd
  151. end;else if x="A" then do
  152.     call listareas(pushstack(ucmd,DelCmd))
  153. end
  154. signal maincmd
  155. call cleanup
  156. exit 0
  157.  
  158. listareas:
  159. call send(cls)
  160.  
  161. if stacked then do
  162.     x=popstack(NumString)
  163.     if datatype(x,"N") & (x>0 & x<areas) then do
  164.         call showarea(x)
  165.         signal maincmd
  166.     end
  167. end
  168.  
  169.  
  170. display=1;scroll=1
  171. do plines=1 to areas
  172.     if Name.plines='NAME.'plines then iterate
  173.     Number.plines=strip(Number.plines)
  174.     if length(Number.plines)=1 then call send("  "Number.plines"    "BOLD||Name.plines||AOFF||NL)
  175.     else call send(" "Number.plines"    "BOLD||Name.plines||AOFF||NL)
  176.     display=display+1
  177.     if display>screen | plines=areas then do
  178.         if stacked then x=popstack(OneChar)
  179.         else do
  180.             if expert then ucmd=uprompt(NL||BOLD ,
  181.                 ||" [N]ewfiles    [S]earch    [C]hange Menu  [Q]uit to Main Menu"NL ,
  182.                 ||" [D]irection   [H]elp      Select Area or Hit Return Key to page "direction.scroll": "AOFF)
  183.             else do
  184.                 call help_l('novice')
  185.                 ucmd=uprompt(NL||BOLD" Hit Return Key to page "direction.scroll"  Command: "AOFF)
  186.             end
  187.             stacked=pushstack(ucmd,AddCmd)
  188.             if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  189.         end
  190.         if datatype(x,"N") & (x>0 & x<areas) then do
  191.             call showarea(x)
  192.             signal maincmd
  193.         end;else if x="S" then call searchlist(pushstack(ucmd,DelCmd))
  194.         else if x="C" then call changeopt(pushstack(ucmd,DelCmd))
  195.         else if x="N" then call newsinceall(pushstack(ucmd,DelCmd))
  196.         else if x="H" then call help_l()
  197.         else if x="D" then scroll=~scroll
  198.         else if x="Q" then signal maincmd
  199.         else if x="|" then x="|"
  200.         else if x~="-" & x~="" then call send(invalid)
  201.         call send(cls)
  202.         display=1
  203.         if ~scroll then do
  204.             if plines>page then plines=plines-page;else plines=0
  205.         end
  206.     end
  207. end
  208. signal listareas
  209.     
  210. nomarkexit:
  211. call send(nomarks)
  212. if notgrab | debug then call send(' Returning to system'NL)
  213. else call send(' Returning to GRAB'NL)
  214. call cleanup()
  215. call delay(30)
  216. exit 0
  217.  
  218. changeopt:
  219. call send(cls)
  220. do forever
  221.     if stacked then x=popstack(OneChar)
  222.     else do
  223.         if expert then ucmd=uprompt(NL||BOLD" [A]nsi       [E]xpert    [Q]uit to Main Menu: "AOFF)
  224.         else do
  225.             call help_c('novice')
  226.             ucmd=uprompt(NL||BOLD" Command: "AOFF)
  227.         end
  228.         stacked=pushstack(ucmd,AddCmd)
  229.         if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  230.     end   
  231.     if x="Q" then return
  232.     else if x="A" then do
  233.         ansi=~(ansi)
  234.         if ansi then do
  235.             CSI='1b'x||'[';AOFF=CSI||'0m';BOLD=CSI||'1m';ITALICS=CSI||'3;40m'
  236.         end;else do
  237.             CSI='';AOFF='';BOLD='';ITALICS=''
  238.         end
  239.     end;else if x="E" then do
  240.         expert=~(expert)
  241.         if expert then do
  242.             screen=20;page=40
  243.         end;else do
  244.             screen=10;page=20
  245.         end
  246.     end
  247. end
  248. return
  249.  
  250. download:
  251. if timeup then call send(BOLD' Your time is up'AOFF||NL)
  252. if marks=0 then do
  253.     call send(nomarks)
  254.     if timeup then signal nomarkexit
  255.     else signal maincmd
  256. end
  257. call send(' You have selected 'marks' files, 'markedbytes' Bytes'NL)
  258. do i=1 to words(mlist)
  259.     if left(word(mlist,i),4)="ARC:" then call send(" "right_justify(i,2)" "left_justify(get_fn(word(mlist,i)),24)" "right_justify(word(blist,i)" bytes",24)||NL)
  260.     else call send(" "right_justify(i,2)" "left_justify(word(mlist,i),24)" "right_justify(word(blist,i)" bytes",24)||NL)
  261. end
  262. bytesleft=bytelimit-markedbytes
  263. if bytesleft>0 then call send(copies(" ",8)||"Free Bytes Remaining:"||right_justify(bytesleft" bytes",24)||NL)
  264.  
  265. if stacked then x=popstack(OneChar)
  266. else do
  267.     if expert then ucmd=uprompt(NL||BOLD ,
  268.         ||" [D]ownload   [C]ontinue  [U]nmark  [A]bort  [H]elp: "AOFF)
  269.     else do
  270.         call help_d('novice')
  271.         ucmd=uprompt(NL||BOLD" Command: "AOFF)
  272.     end
  273.     stacked=pushstack(ucmd,AddCmd)
  274.     if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  275. end
  276. if ~timeup & x="C" then signal maincmd
  277. else if x="U" then do
  278.     if stacked then unmark=popstack(OneChar);else unmark=word(uprompt(" Select file number to Unmark: "),1)
  279.     if datatype(unmark,"N") & unmark~="" & (unmark < words(mlist)+1) then do
  280.         mlist=space(delstr(mlist,pos(word(mlist,unmark),mlist),length(word(mlist,unmark))+1),1)
  281.         blist=space(delstr(blist,pos(word(blist,unmark),blist),length(word(blist,unmark))+1),1)
  282.         marks=marks-1
  283.         markedbytes=0
  284.         do i=1 to words(blist)
  285.             markedbytes=markedbytes+word(blist,i)
  286.         end
  287.     end
  288.     signal download
  289. end;else if x="H" then do
  290.     call help_d()
  291.     signal download
  292. end;else if x="D" then do
  293.     if marks=0 then do
  294.         call send(nomarks)
  295.         if ~timeup then signal maincmd
  296.     end
  297.     if notgrab then do
  298.         call send(' Select GRAB on the Main Menu to download the files you have marked'NL)
  299.         call delay(50)
  300.     end
  301.     greq='Mail:Inbound/USERS/'translate(upper(strip(username)),'_',' ')||'.GRAB'
  302.  
  303.     if pos("ARC:",mlist)~=0 | pos("ARCHIVES:",mlist)~=0 then do
  304.         nmlist=""
  305.         do i=1 to words(mlist)
  306.             f=word(mlist,i)   
  307.             if left(f,4)~="ARC:" & left(f,9)~="ARCHIVES:" then nmlist=nmlist||f" "
  308.             else do
  309.                 nf=get_fn(f)
  310.                 nmlist=nmlist||nf" "
  311.                 address COMMAND "Echo >>"freqlist nf f
  312.             end
  313.         end
  314.         mlist=nmlist
  315.     end
  316.  
  317.     mlist=translate(mlist,'0a'x," ")
  318.     call open('req',greq,"W")
  319.     call writech('req',mlist)
  320.     call close('req')
  321.     call cleanup()
  322.     exit 1
  323. end;else if x="A" then do
  324.     call send(' Clearing marked files list'NL)
  325.     signal nomarkexit
  326. end;else if x="|" then x="|"
  327. else if x~="-" & x~="" then call send(invalid)
  328. signal download
  329. return 0
  330.  
  331. showarea:
  332. area=arg(1)
  333. if Path.area="PATH."area | upper(strip(Path.area))="NULL:" then do
  334.     call ClrStackErr('Area 'BOLD||area||AOFF' does not exist')
  335.     return
  336. end
  337. call send(' Scanning Area:'area BOLD||Name.area||AOFF||NL)
  338. areadir=addslash(dequote(Path.area))
  339. las='PIPE LIST 'areadir||NOLIST' FILES NOHEAD LFORMAT 'LISTFMT' | SORT In: 'tmpbbs
  340. address command las
  341. call send(cls)
  342. call pagelist(tmpbbs,'bbs')
  343. return
  344.  
  345.  
  346. searchlist:
  347. call send(cls)
  348. scmd:
  349. if stacked then x=popstack(OneChar)
  350. else do
  351.     if expert then ucmd=uprompt(NL||BOLD" [F]ile       [D]esc      [H]elp      [Q]uit Search: "AOFF)
  352.     else do
  353.         call help_s('novice')
  354.         ucmd=uprompt(NL||BOLD" Command: "AOFF)
  355.     end
  356.     stacked=pushstack(ucmd,AddCmd)
  357.     if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  358. end
  359. if x="|" then x="|"
  360. else if x="Q" then do
  361.     call send(cls)
  362.     return
  363. end;else if x="H" then do
  364.     call help_s()
  365.     signal scmd
  366. end;else if x="F" then do
  367.     if stacked then tofind=popstack(OneWord);else tofind=uprompt(' Enter AmigaDOS wildcard File search string: ')
  368.     if tofind="" then return
  369.     if pos('*',tofind)>0 then do
  370.         call send(' Please use standard AmigaDos wildcards'bel||NL)
  371.         return
  372.     end
  373.     if pos('#?',tofind)=0 then do
  374.         call send(' AmigaDOs WildCard missing, adding default'bel||NL)
  375.         tofind=tofind'#?'
  376.     end
  377.     call send(' Searching for Files matching 'tofind||NL)
  378.     call send(' Hit ctl-C to stop search at any time'NL)
  379.     address COMMAND 'Fsearch >'matchlist freqlist tofind' -s'
  380.     if ~open('ml',matchlist,'r') then return
  381.     cmd=1;lstring.cmd=""
  382.     call open('x',tmpsch,'w');call close('x')
  383.     do while ~eof('ml')
  384.         fl=readln('ml')
  385.         if fl="!@ No match found" then do
  386.             call ClrStackErr(fl" for file:"tofind)
  387.             call close('ml')
  388.             return
  389.         end
  390.         fn=word(fl,2)
  391.         las='LIST 'lstring.cmd' NOHEAD LFORMAT 'LISTFMT' >>'tmpsch
  392.         if length(fn)+length(las)+1 >200 then do
  393.             cmd=cmd+1
  394.             lstring.cmd=""
  395.         end
  396.         lstring.cmd=lstring.cmd' 'fn
  397.     end
  398.     call close('ml')
  399.     do i=1 to cmd
  400.         las='LIST 'lstring.i' NOHEAD LFORMAT 'LISTFMT' >>'tmpsch
  401.         options failat 99;address command las;options failat 20
  402.         call delay(50)
  403.     end
  404.     call send(' Found matchs for 'tofind', Hit RETURN'bel||NL)
  405.     call pagelist(tmpsch,'sch')
  406. end;else if x="D" then do
  407.     if stacked then tofind=popstack(OneWord);else tofind=word(uprompt(' Enter a keyword for Description search: '),1)
  408.     if tofind="" then return
  409.     call send(' Searching for Descriptions containing keyword:'tofind||NL)
  410.     call send(' Hit ctl-C to stop search at any time'NL)
  411.     address COMMAND search' >'matchlist fileslist tofind
  412.     if ~open('ml',matchlist,'r') then do
  413.         call ClrStackErr('!@ No match found for keyword:'tofind)
  414.         return
  415.     end
  416.     if ~open('x',tmpsch,'w') then return
  417.     discard=readln('ml')
  418.     do while ~eof('ml')
  419.         call writeln('x',delstr(readln('ml'),1,1))
  420.     end
  421.     call close('x');call close('ml')
  422.     call send(' Found matchs for 'tofind', Hit RETURN'bel||NL)
  423.     call pagelist(tmpsch,'sch')
  424. end;else if x~="-" & x~="" then call send(invalid)
  425. return
  426.  
  427.  
  428. getsince:
  429. if stacked then days=popstack(OneChar);else days=uprompt(' How many days back? (1-'SinceLimit'): ')
  430. if ~datatype(days,"N") | (days<=0 | days>SinceLimit) then do
  431.     call ClrStackErr("Days "days" must be > 0 and < "SinceLimit)
  432.     return 0
  433. end
  434. sincedate=space(date('n',date('i')-days),1,'-')
  435. sincedate=left(overlay(substr(sincedate,10,2),sincedate,8,2),9)
  436. return 1
  437.  
  438. newsinceall:
  439. if exists(newall) then do
  440.     if ~newer(newall,freqlist) then call delete(newall)
  441.     else do
  442.         NewCmt=subword(statef(newall),8)
  443.         call Send(' Found List of 'NewCmt||bel||NL)
  444.         ucmd=upper(uprompt(' View the existing up-to-date NewFiles list? (y/N): '))
  445.         if ucmd="Y" then do
  446.             call pagelist(newall,'all')
  447.             return
  448.         end
  449.     end
  450. end    
  451. if ~getsince() then return
  452. if stacked then dosort=popstack(OneChar)=="S";else dosort=upper(left(uprompt(" Alphabetically [S]orted (fast) or by [A]rea (slow): (s/A) "),1))=="S"
  453. call Send(' Searching 'BOLD'ALL'AOFF' areas for new files received since 'BOLD||sincedate||AOFF||NL)
  454. call send(' Hit ctl-C to stop search at any time'NL)
  455. tmp="";tl=length(BOLD||AOFF)
  456. savelist=(days=7 & ~dosort)
  457. do area=1 to areas
  458.     if Path.area="PATH."area | upper(strip(Path.area))="NULL:" then iterate
  459.     if tmp~="" then do
  460.         if tl>0 then call send(copies('08'x,length(tmp)-tl))
  461.         else call send(copies('08'x,length(tmp)))
  462.     end
  463.     tmp=' Searching Area 'BOLD||Number.area||AOFF
  464.     if ~dosort then Address COMMAND 'Echo >>'newall' "       Area 'BOLD||Number.area' 'ITALICS||Name.area||AOFF'"'
  465.     call send(tmp)
  466.     areadir=addslash(dequote(Path.area))
  467.     las='LIST 'areadir||NOLIST' SINCE' sincedate 'FILES NOHEAD LFORMAT 'LISTFMT' >>'newall
  468.     address COMMAND las
  469. end
  470. call send(NL)
  471. if dosort then address COMMAND "SORT FROM "newall" TO "newall
  472. if savelist then do
  473.     address COMMAND 'COPY 'newall' TO MAIL:FILELISTS/NEWFILES.LST'
  474.     call Send(' Updated Last 7 days NewFiles listing'||NL)
  475. end
  476. call setcomment(newall,"Last "days" days, since:"sincedate)
  477. call send(bel)
  478. call pagelist(newall,'all')
  479. return
  480.  
  481. newsince:
  482. if ~getsince() then return 0
  483. areadir=addslash(dequote(Path.area))
  484. call Send(' Searching Area 'BOLD||Number.area||AOFF' for new files received since 'BOLD||sincedate||AOFF||NL)
  485. call send(' Hit ctl-C to stop search at any time'NL)
  486. las='PIPE LIST 'areadir||NOLIST' SINCE' sincedate 'FILES NOHEAD LFORMAT 'LISTFMT' | SORT In: 'tmpnew
  487. address COMMAND las
  488. call send(bel)
  489. if word(statef(tmpnew),2)>0 then call pagelist(tmpnew,'new')
  490. else call ClrStackErr('None found')
  491. return
  492.  
  493. enterarc:
  494. fname=arg(1)
  495. if (upper(right(fname,3))~="LHA" & upper(right(fname,3))~="LZH") then do
  496.     call send(' Cannot enter 'arg(1))
  497.     return
  498. end
  499. if debug then call Kprint('INARC:'inarc areadir fname arclevel)
  500. if ~inarc then do
  501.     areadir="ARC:"translate(ExpandAssign(fname),"/",":")
  502.     arclevel=1
  503. end;else do
  504.     call pushlist('arc'arclevel)
  505.     areadir="ARCHIVES:ARCHIVES"translate(ExpandAssign(fname),"/",":")
  506.     arclevel=2
  507. end
  508. if debug then call Kprint('expand:'areadir arclevel)
  509. call send(' Scanning Archive as Area:'areadir||NL)
  510. las='LIST >'tmparc||arclevel areadir' ALL FILES NOHEAD LFORMAT 'ARCFMT
  511. address command las
  512. call send(cls)
  513. inarc=1
  514. call pagelist(tmparc||arclevel,'arc'arclevel)
  515. return 0
  516.  
  517. viewfile:
  518. fname=arg(1)
  519. file=get_fn(fname)
  520. arclevel=0
  521. if archandler & ((upper(right(fname,3))="LHA" | upper(right(fname,3))="LZH") | inarc) then do
  522.     if ~inarc then do
  523.         if debug then call Kprint('INARC:'inarc areadir)
  524.         areadir="ARC:"translate(ExpandAssign(fname),"/",":")
  525.         if debug then call Kprint('expand INARC:'inarc areadir)
  526.         call send(' Scanning Archive as Area:'areadir||NL)
  527.         las='LIST >'tmparc||arclevel areadir' ALL FILES NOHEAD LFORMAT 'ARCFMT
  528.         address command las
  529.         call send(cls)
  530.         inarc=1;call pagelist(tmparc||arclevel,'arc'arclevel);inarc=0
  531.         return 0
  532.     end
  533. end
  534. if ~open('in',fname,'R') then do
  535.     call send(" Can't open" '"'file'"'bel||NL)
  536.     if debug then call Kprint(" Can't open "fname)
  537.     call vcleanup
  538.     return
  539. end;else do
  540.     buff=readch('in',8);call close('in')
  541.     select
  542.         when left(buff,4)=='ZOO ' then do
  543.             xcmd='zoo x';lcmd='zoo >'tmplst' l'
  544.         end
  545.         when substr(buff,3,3)=='-lh' then do
  546.             xcmd='lha x';lcmd='lha >'tmplst' vv'
  547.         end
  548.         when left(buff,1)=='1A'x then do
  549.             xcmd='arc x';lcmd='arc >'tmplst' l'
  550.         end
  551.         otherwise cmd=tview
  552.     end
  553.     if cmd=tview then do
  554.         if ~displayable(fname) then call send(' File 'file' does not seems to be displayable'bel||NL)
  555.         else do
  556.            if debug then address COMMAND cmd fname
  557.            else address COMMAND cmd fname redirect
  558.         end
  559.     end;else do
  560.         call pragma('D',temp)
  561.         call send(" Please wait..listing archive "file||NL)
  562.         address command lcmd fname
  563.         call send(cls)
  564.         if debug then address COMMAND tview tmplst    
  565.         else address COMMAND tview tmplst redirect
  566.  
  567.         tname=uprompt(" Enter fullpath of file to read: ")
  568.         if tname~="" then do
  569.             call send(NL" Please wait, extracting "tname||NL)
  570.             address command xcmd fname tname
  571.             address COMMAND 'Protect >NIL: 'temp||tname' +d'
  572.             call send(cls)
  573.             cmd=tview
  574.             if ~displayable(temp||tname) then call send(' File 'tname' does not seems to be displayable'bel||NL)
  575.             else do
  576.                if debug then address COMMAND cmd temp||tname
  577.                else address COMMAND cmd temp||tname redirect
  578.             end
  579.         end
  580.         call vcleanup
  581.     end
  582. end
  583. return
  584.  
  585. displayable:
  586. if ~open('af',arg(1)) then do
  587.     if inarc then return 1
  588. end;else do
  589.     h=readch('af',100)
  590.     call close('af')
  591.     if left(h,2)='PP' then do
  592.         cmd=pview;return 1
  593.     end;else if length(compress(h,xrange(' ','~')xrange('a0'x,'ff'x)'0a'x))<10 then return 1
  594. end
  595. return 0
  596.  
  597.  
  598. pagelist:
  599. thelist=arg(1)
  600. handle=arg(2)
  601. mode=arg(3)
  602. if debug then call Kprint('List:'thelist' Handle:'handle)
  603. if show('F',handle) then call close(handle)
  604. repagelist:
  605. if ~open(handle,thelist,'R') then do
  606.     call ClrStackErr('SYSTEM Cannot open 'thelist handle' INFORM SYSOP')
  607.     return 0
  608. end
  609. if thelist=tmparc||arclevel then ltype='Archive Contents List'
  610. else if thelist=tmpsch then ltype='Search Match List'
  611. else if thelist=newall then ltype='Global NewFiles List'
  612. else if thelist=tmpnew then ltype='NewFiles in Area :'area Name.area
  613. else ltype='File Area:'area Name.area
  614.  
  615. tagged=0;tag=1;display=1
  616. this_page_offset=0;last_page_offset=0
  617. file_offset=0
  618. this_page_tags=0;last_page_tags=0
  619. scroll=1
  620. if mode~='R' then call pushstack ("|")
  621. if ~areacmd() then do
  622.     call close(handle)
  623.     return 0
  624. end
  625. call send(cls)
  626. do while ~eof(handle)
  627.     line=readln(handle)
  628.     this_page_offset=this_page_offset+(length(line)+1)
  629.     file_offset=file_offset+this_page_offset
  630.     if left(line,1)=":" then iterate
  631.     if left(line,1)=" " then do
  632.         call send(line||NL)
  633.         display=display+1
  634.     end;else do
  635.         file.tag=word(line,1)
  636.         bytes.tag=word(line,2)
  637.         if ~inarc then call send(' 'wrap_line('['center(tag,3)']' line,FLLEN,MARGINALL))
  638.         else do
  639.             parse var line n b d c
  640.             call send(' 'wrap_line('['center(tag,3)']' left_justify(get_fn(n),20) right_justify(b,7) left_justify(d,9) c,FLLEN,MARGINALL))
  641.             drop n b d c
  642.         end
  643.         tagged=tag
  644.         tag=tag+1
  645.         this_page_tags=this_page_tags+1
  646.  
  647.         if display>=screen then do
  648. /*
  649.             if debug then do
  650.                 call Kprint('Tag      :'tag' Tagged   :'tagged)
  651.                 call Kprint('Page_Tags:'this_page_tags last_page_tags)
  652.                 call Kprint('FilePos  :'File_offset)
  653.                 call Kprint('Offset   :'this_page_offset last_page_offset)
  654.             end
  655. */
  656.             if ~areacmd() then do
  657.                 call close(handle)
  658.                 return 0
  659.             end
  660. if debug then call Kprint('Handle:'handle)
  661.             if ~scroll then do
  662.                 seek_offset=this_page_offset+last_page_offset
  663.                 file_offset=file_offset-seek_offset
  664.                 tag=tag-(this_page_tags+last_page_tags)
  665.                 tagged=tagged-(this_page_tags+last_page_tags)
  666.                 if file_offset<0 | tag<0 | tagged<0 then do
  667.                     tagged=0;tag=1;display=1
  668.                     this_page_offset=0;last_page_offset=0;file_offset=0
  669.                     this_page_tags=0;last_page_tags=0
  670.                     call seek(handle,0,'B')
  671.                 end;else do
  672.                     call seek(handle,-seek_offset,'C')
  673. /*
  674.                   if debug then do
  675.                         call Kprint('Tag      :'tag' Tagged   :'tagged)
  676.                         call Kprint('Page_Tags:'this_page_tags last_page_tags)
  677.                         call Kprint('FilePos  :'File_offset)
  678.                         call Kprint('Offset   :'this_page_offset'+'last_page_offset':'seek_offset)      
  679.                     end
  680. */
  681.                 end
  682.             end
  683.             display=1
  684.             last_page_offset=this_page_offset
  685.             last_page_tags=this_page_tags
  686.             this_page_offset=0;this_page_tags=0
  687. /*
  688.                 if debug then do
  689.                     call Kprint('Page_Tags:'this_page_tags last_page_tags)
  690.                     call Kprint('Offset   :'this_page_offset last_page_offset)      
  691.                 end
  692. */
  693.             call send(cls)
  694.         end
  695.     end
  696. end /*eof */
  697. call close(handle)
  698. call send(' End of 'ltype||NL)
  699. if areacmd('end') then call pagelist(thelist,handle,"R")
  700. return
  701.  
  702. areacmd:
  703. if thelist=tmpsch | thelist=newall then do
  704.     notarea=1;inarc=0
  705.     aprompt=ITALICS||" "ltype||AOFF||NL||BOLD ,
  706.           ||" [M]ark Files  [D]irection   [A]rea Menu   [Q]uit to Main Menu"NL ,
  707.           ||" [H]elp        Hit Return Key to page "direction.scroll": "AOFF
  708. end;else if thelist=tmparc||arclevel then do
  709.     notarea=0;inarc=1 
  710.     aprompt=ITALICS||" "ltype||AOFF||NL||BOLD ,
  711.           ||" [M]ark Files  [V]iew Files  [D]irection   [Q]uit to Main Menu"NL ,
  712.           ||" [H]elp        Hit Return Key to page "direction.scroll": "AOFF
  713. end;else do
  714.     notarea=0;inarc=0
  715.     aprompt=ITALICS||" "ltype||AOFF||NL||BOLD ,
  716.           ||" [M]ark Files  [D]irection   [A]rea Menu   [Q]uit to Main Menu"NL ,
  717.           ||" [N]ew Since   [V]iew        [H]elp        Hit Return Key to page "direction.scroll": "AOFF
  718. end
  719. do forever
  720.     if stacked then x=popstack(OneChar)
  721.     else do
  722.         if expert then ucmd=uprompt(aprompt)
  723.         else do
  724.             call send(" "ltype||NL)
  725.             if inarc then call help_x('novice')
  726.             else call help_a('novice')
  727.             ucmd=uprompt(NL||BOLD" Hit Return Key to page "direction.scroll"  Command: "AOFF)
  728.         end
  729.         stacked=pushstack(ucmd,AddCmd)
  730.         if stacked then x=popstack(OneChar);else x=upper(left(ucmd,1))
  731.     end
  732.     if x="Q" | x="A" then do
  733.         if inarc then do
  734.             inarc=0
  735.             signal maincmd    
  736.         end
  737.         return 0
  738.     end;else if x="D" then do
  739.         scroll=~scroll
  740.         return 1
  741.     end;else if x="H" then do
  742.         if inarc then call help_x()
  743.         else call help_a()
  744.     end;else if x="N" & ~notarea & ~inarc then call newsince(pushstack(ucmd,AddCmd))
  745.     else if x="M" then do
  746.         if stacked then marked=popstack(NumString);else marked=uprompt(' Files:'marks 'Bytes:'markedbytes' Enter File number(s): ')
  747.         ucmd=""
  748.         do x=1 to words(marked)
  749.             y=word(marked,x)
  750.             if y<1 | y>tagged | ~datatype(y,"N") then do
  751.                 call send(' Invalid mark 'y' ignored, try [H]elp'NL)
  752.                 iterate
  753.             end;else if bytes.y+markedbytes>bytelimit then do
  754.                 call Send(' Sorry, 'file.y bytes.y' bytes exceeds your 'bytelimit' byte limit'NL)
  755.                 iterate
  756.             end;else do
  757.                 markedbytes=markedbytes+bytes.y
  758.                 blist=blist||bytes.y" "
  759.                 mlist=mlist||file.y||" "
  760.                 marks=marks+1
  761.                 call send(' 'file.y bytes.y' bytes,  Marked for Download'NL)
  762.             end
  763.         end
  764.         call getreturn
  765.     end;else if x="V" & ~notarea then do
  766.         if stacked then marked=PopStack(NumString);else marked=uprompt(' Enter number of file to view or list: ')
  767.         y=word(marked,1)
  768.         if y<1 | y>tagged | ~datatype(y,"N") then do
  769.             call send(' Invalid mark 'y' ignored, try [H]elp'NL)
  770.         end;else do
  771.             if ~inarc then call viewfile(areadir||file.y)
  772.             else call viewfile(file.y)
  773.         end
  774.         call getreturn
  775.     end;else if x="E" & archandler & ~notarea then do
  776.         if stacked then marked=PopStack(NumString);else marked=uprompt(' Enter number of archive to enter: ')
  777.         y=word(marked,1)
  778.         if y<1 | y>tagged | ~datatype(y,"N") then do
  779.             call send(' Invalid mark 'y' ignored, try [H]elp'NL)
  780.         end;else do
  781.             if ~inarc then call enterarc(areadir||file.y)
  782.             else call enterarc(file.y)
  783.         end
  784.         call getreturn
  785.     end;else if x="R" & archandler & inarc & arclevel~=0 then do
  786.         call close(handle||arclevel)
  787.         arclevel=arclevel-1
  788.         if arclevel=0 then do
  789.             inarc=0
  790.             handle='bbs'
  791.         end;else do
  792.             handle='arc'arclevel
  793.         end
  794.        call poplist(handle)
  795.         return 1
  796.     end;else if x="" & arg(1)='end' then do
  797.         scroll=~scroll
  798.         call pushstack('D')   
  799.         return 1  
  800.     end;else if x="|" then return 1
  801.     else if x~="-" & x~="" then call send(invalid)
  802.     else return 1
  803. end
  804. return 0
  805.  
  806.  
  807. wrap_line:
  808. if debug then term=LF;else term=NL
  809. text=arg(1);rEdge=arg(2)/*line length*/;lEdge=arg(3)/*wrapmargin*/
  810. Ntext=''
  811. do while length(text)>0
  812.     broken_word=0
  813.     if length(text)<rEdge then do
  814.         Ntext=Ntext||text||term
  815.         display=display+1;text=''
  816.     end;else do
  817.         Ttext=strip(text,l)
  818.         diff=length(text)-length(Ttext)
  819.         first_break=lastpos(' ',Ttext,rEdge-diff)
  820.         break_point=first_break+diff
  821.         if lEdge=break_point then do
  822.             break_point=rEdge-1
  823.             broken_word=1
  824.         end
  825.         Ntext=Ntext||strip(left(text,break_point),t)
  826.         if broken_word then Ntext=Ntext||'-'
  827.         Ntext=Ntext||term
  828.         display=display+1
  829.         text=copies(' ',lEdge)||strip(right(text,length(text)-break_point),l)
  830.     end
  831. end
  832. return Ntext
  833.  
  834. cleanup:
  835. call vcleanup()
  836. call delete(matchlist)
  837. call delete(tmpbbs)
  838. do i=0 to 3;call delete(tmparc||i);end
  839. call delete(tmpsch)
  840. call delete(tmpnew)
  841. return
  842. vcleanup:
  843. if exists(temp||tmplst) then call delete(temp||tmplst)
  844. if exists(temp||tname) then call delete(temp||tname)
  845. call pragma('D',olddir)
  846. return
  847.  
  848.  
  849. ClrStackErr:
  850. call send(BOLD" Error:"AOFF||arg(1)||bel" - Clearing command stack"bel||NL)
  851. stacked=0;cstack=""
  852. call getreturn
  853. return
  854.  
  855. help_m:
  856. if arg(1)~='novice' then do
  857.     call main_help()
  858.     call send(cls||BOLD||ITALICS' Main Menu Help'AOFF||NL)
  859. end;else call send(NL)    
  860. call send(BOLD' Select Area Number 'AOFF' - 'ITALICS'Enter number to Select a file area'AOFF||NL)
  861. call send(BOLD' [A]reas            'AOFF' - 'ITALICS'List available file areas'AOFF||NL)
  862. call send('                       'ITALICS'You can page forwards and backwards'AOFF||NL)
  863. call send(BOLD' [S]earch           'AOFF' - 'ITALICS'Search for a file by name or description'AOFF||NL)
  864. call send(BOLD' [N]ewFiles         'AOFF' - 'ITALICS'List all files received in last N days'AOFF||NL)
  865. call send(BOLD' [D]ownload         'AOFF' - 'ITALICS'List/DownLoad/Clear marked files'AOFF||NL)
  866. call send(BOLD' [C]hange           'AOFF' - 'ITALICS'Change your ANSI, MENU, HELP Settings'AOFF||NL)
  867. call send(BOLD' [E]xit             'AOFF' - 'ITALICS'If you have marked files, you will be'AOFF||NL)
  868. call send('                       'ITALICS'prompted to DownLoad or Abort'AOFF||NL)
  869. call send('                       'ITALICS'otherwise, returns to GRAB'AOFF||NL)
  870. if arg(1)~='novice' then call getreturn
  871. return
  872. help_l:
  873. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' Area Menu Help'AOFF||NL)
  874. else call send(NL)    
  875. call send(BOLD' Select Area Number 'AOFF' - 'ITALICS'Enter number to select a file area'AOFF||NL)
  876. call send(BOLD' [D]irection        'AOFF' - 'ITALICS'Changes direction of areas list paging'AOFF||NL)
  877. call send('                       'ITALICS'RETURN pages in direction selected'AOFF||NL)
  878. call send(BOLD' [N]ewFiles         'AOFF' - 'ITALICS'List all files received in last N days'AOFF||NL)
  879. call send(BOLD' [S]earch           'AOFF' - 'ITALICS'Search for a file by name or description'AOFF||NL)
  880. call send(BOLD' [C]hange           'AOFF' - 'ITALICS'Change ANSI, MENU, EXPERT Settings'AOFF||NL)
  881. call send(BOLD' [Q]uit             'AOFF' - 'ITALICS'Return to Main Menu'AOFF||NL)
  882. if arg(1)~='novice' then call getreturn
  883. return
  884. help_a:
  885. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' File Menu Help'AOFF||NL)
  886. call send(BOLD' [A]rea             'AOFF' - 'ITALICS'Go to Area List Menu'AOFF||NL)
  887. call send(BOLD' [D]irection        'AOFF' - 'ITALICS'Changes direction of files list paging'AOFF||NL)
  888. call send('                       'ITALICS'RETURN pages in direction selected'AOFF||NL)
  889. call send(BOLD' [R]edisplay        'AOFF' - 'ITALICS'Show file list again if at End'AOFF||NL)
  890. call send(BOLD' [N]ew Since        'AOFF' - 'ITALICS'List files in this area received in last N days'AOFF||NL)
  891. call send(BOLD' [M]ark             'AOFF' - 'ITALICS'Mark file(s) for download'AOFF||NL)
  892. call send('                       'ITALICS'You may only mark up to the current highest number'AOFF||NL) 
  893. call send('                       'ITALICS'Displays number of files and bytes marked'AOFF||NL) 
  894. call send(BOLD' [V]iew             'AOFF' - 'ITALICS'View a text file, the contents of an archive'AOFF||NL)
  895. call send('                       'ITALICS'or a text file in an archive'AOFF||NL)
  896. call send('                       'ITALICS'View is only valid in a FILE area'AOFF||NL)
  897. call send(BOLD' [Q]uit             'AOFF' - 'ITALICS'Return to previous menu'AOFF||NL)
  898. if arg(1)~='novice' then call getreturn
  899. return
  900. help_x:
  901. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' Archive Contents Help Menu'AOFF||NL)
  902. call send(BOLD' [M]ark             'AOFF' - 'ITALICS'Mark file(s) for download from the archive'AOFF||NL)
  903. call send('                       'ITALICS'You may only mark up to the current highest number'AOFF||NL) 
  904. call send('                       'ITALICS'Displays number of files and bytes marked'AOFF||NL) 
  905. call send(BOLD' [V]iew             'AOFF' - 'ITALICS'View a text file in the archive'AOFF||NL)
  906. call send(BOLD' [D]irection        'AOFF' - 'ITALICS'Changes direction of files list paging'AOFF||NL)
  907. call send('                       'ITALICS'RETURN pages in direction selected'AOFF||NL)
  908. call send(BOLD' [Q]uit             'AOFF' - 'ITALICS'Return to previous menu'AOFF||NL)
  909. if arg(1)~='novice' then call getreturn
  910. return
  911. help_d:
  912. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' DownLoad Menu Help'AOFF||NL)
  913. else call send(NL)    
  914. call send(BOLD' [C]ontinue         'AOFF' - 'ITALICS'Continue marking files'AOFF||NL)
  915. call send(BOLD' [U]nmark           'AOFF' - 'ITALICS'Unmark and removed file from download list'AOFF||NL)
  916. call send(BOLD' [D]ownload         'AOFF' - 'ITALICS'Gives list of files marked to GRAB'AOFF||NL)
  917. call send('                       'ITALICS'for downloading to you'AOFF||NL)
  918. call send(BOLD' [A]bort            'AOFF' - 'ITALICS'Marked list is cleared and you are'AOFF||NL)
  919. call send('                       'ITALICS'returned to GRAB filename request prompt'AOFF||NL)
  920. if arg(1)~='novice' then call getreturn
  921. return
  922. help_c:
  923. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' Change Menu Help'AOFF||NL)
  924. else call send(NL)    
  925. call send(BOLD' [A]nsi             'AOFF' - 'ITALICS'Toggle ANSI Display'AOFF||NL)
  926. call send(BOLD' [E]xpert           'AOFF' - 'ITALICS'Toggle Expert/Novice Menus'AOFF||NL)
  927. call send(BOLD' [Q]uit             'AOFF' - 'ITALICS'Return to Main menu'AOFF||NL)
  928. if arg(1)~='novice' then call getreturn
  929. return
  930. help_s:
  931. if arg(1)~='novice' then call send(cls||BOLD||ITALICS' Search Menu Help'AOFF||NL)
  932. else call send(NL)    
  933. call send(BOLD' [F]ile             'AOFF' - 'ITALICS'Search for a file by name, USE WILDCARDS'AOFF||NL)
  934. call send('                       'ITALICS'You may mark files for download from match list'AOFF||NL)
  935. call send(BOLD' [D]escription      'AOFF' - 'ITALICS'Search for a file by description, no WILDCARDS'AOFF||NL)
  936. call send('                       'ITALICS'You CAN use a partial description'AOFF||NL)
  937. call send('                       'ITALICS'You may mark files for download from match list'AOFF||NL)
  938. call send(BOLD' [Q}uit             'AOFF' - 'ITALICS'Return to area menu'AOFF||NL)
  939. if arg(1)~='novice' then call getreturn
  940. return
  941.  
  942. pushstack: 
  943. if arg(1)="UCMD" | arg(1)="" then return stacked
  944. if cstack~="" then do
  945.     if arg(2)=DelCmd then cstack=strip(delstr(arg(1),1,length(word(arg(1),1))))
  946.     else cstack=cstack||" "||arg(1)
  947. end;else do
  948.     if arg(2)=DelCmd then cstack=strip(delstr(arg(1),1,length(word(arg(1),1))))
  949.     else cstack=arg(1)
  950. end
  951. stacked=words(cstack)>0
  952. ucmd=""
  953. return stacked
  954.  
  955. popstack:
  956. if cstack="" then do
  957.     stacked=0;return '-'
  958. end
  959. if arg(1)=NumString then do
  960.     py=""
  961.     do forever
  962.         if cstack="" then return strip(py)
  963.         px=word(cstack,1)
  964.         if ~datatype(px,'N') then return strip(py)
  965.         py=py||" "||strip(px)
  966.         if words(cstack)>1 then cstack=strip(delstr(cstack,1,length(px)))
  967.         else do
  968.             stacked=1;cstack=""
  969.         end
  970.     end
  971. end
  972.  
  973. px=word(cstack,1)
  974. if words(cstack)>1 then cstack=strip(delstr(cstack,1,length(px)))
  975. else do
  976.     stacked=0;cstack=""
  977. end    
  978. if arg(1)=OneChar then do
  979.     if datatype(px,'N') then py=px
  980.     else py=upper(left(px,1))
  981. end
  982. else py=px
  983. return strip(py)
  984.  
  985. Kprint: return writeln('bd',arg(1))
  986.  
  987. getreturn: return uprompt(BOLD' Hit RETURN 'AOFF)
  988.  
  989. send:
  990. if debug then call writech(STDOUT,arg(1))
  991. else do
  992.     'Print' quote||arg(1)||quote
  993.     'Send' quote||arg(1)||quote
  994. end
  995. return
  996.  
  997. uprompt:
  998. if ~timeup then do
  999.     elapsed=time('e')
  1000.     remaining=TimeLimit-(elapsed/60)
  1001.     if elapsed>=(TimeLimit*60)-120 then call send(BOLD||NL' You have 'trunc(remaining)' Minutes remaining'AOFF||bel||NL) 
  1002.     if elapsed>=(TimeLimit*60) then do
  1003.         timeup=1    
  1004.         call send(BOLD||NL||bel' Poof!'bel' Your time is up!'bel||AOFF||bel||NL)
  1005.         if marks>0 then signal download
  1006.         else signal nomarkexit
  1007.     end
  1008. end   
  1009. if debug then do
  1010.     options prompt arg(1)
  1011.     parse pull u
  1012.     return translate(u,"  ",",;")
  1013. end;else do
  1014.     'Print' quote||arg(1)||quote
  1015.     'Send' quote||arg(1)||quote
  1016.     'GetInbound E0 'InputTimeout
  1017.     'String $(event)'
  1018.     if upper(RESULT)='CARRIER' then do
  1019.         call cleanup
  1020.         exit 10
  1021.     end;else if upper(RESULT)='TIMEOUT' then do
  1022.         call send(NL' User Input TIMEOUT:'timeouts||bel||NL)
  1023.         timeouts=timeouts+1
  1024.         if timeouts>MaxTimeouts then do
  1025.             call send(CLS||bel||NL||bel||NL||bel' Sorry, you have made too many input timeouts, bye'bel||NL)
  1026.             call cleanup
  1027.             exit 10
  1028.         end
  1029.     end;else if upper(RESULT)='LOGIN' then do
  1030.         'String $(namebuf)'
  1031.         u=translate(RESULT,"  ",",;")
  1032.     end;else u=""
  1033. end
  1034. return u
  1035.  
  1036. left_justify:
  1037. if length(arg(1))>arg(2) then return (left(arg(1),arg(2)))
  1038. else return (arg(1)||copies(" ",arg(2)-length(arg(1))))
  1039.  
  1040. right_justify:
  1041. if length(arg(1))>arg(2) then return (right(arg(1),arg(2)))
  1042. else return (copies(" ",arg(2)-length(arg(1)))||arg(1))
  1043.  
  1044. get_fn:
  1045. if LastPos('/',arg(1))~=0 then return SubStr(arg(1),LastPos('/',arg(1))+1)
  1046. else if LastPos(':',arg(1))~=0 then return SubStr(arg(1),LastPos(':',arg(1))+1)
  1047. else return arg(1)
  1048.  
  1049. ExpandAssign: procedure
  1050. pos=Pos(':',arg(1)) + 1
  1051. if pos=0 then return arg(1)
  1052. address COMMAND 'SetEnv BTMP `Assign 'DelStr(arg(1),pos)' EXISTS`'
  1053. x=word(GetVar('BTMP',"G"),2)||"/"||SubStr(arg(1),pos)
  1054. if x='[Mounted]' then return arg(1)
  1055. else return x
  1056.  
  1057. newer: procedure
  1058. x=statef(arg(1))
  1059. y=statef(arg(2))
  1060. if (((word(x,5))*86400)+(word(x,6)*60))>(((word(y,5))*86400)+(word(y,6)*60)) then return 1
  1061. else return 0 
  1062.  
  1063. addslash: procedure
  1064. c=arg(1)
  1065. if right(c,1)=":" | right(c,1)="/" then return c
  1066. else return c"/"
  1067.  
  1068. dequote:
  1069. parse arg thing
  1070. parse var thing '"' unq_thing '"'
  1071. if unq_thing ~= "" then return unq_thing
  1072. return thing
  1073.  
  1074. break_c:
  1075. if upper(uprompt(NL||bel' Are you sure you want to Exit? '))=="N" then return
  1076. break_d:
  1077. halt:
  1078. ioerr:
  1079. call cleanup()
  1080. exit 10
  1081. /**/
  1082.  
  1083. main_help:
  1084. if bytelimit=0 then call send(NL' This is a DEMO of the Browse function of GRAB, no downloads, use GRAB for downloading.'NL)
  1085. call send(NL' Your current byte limit is 'bytelimit' bytes and your current'NL)
  1086. call send(' browsing time limit is 'timelimit' mins.  There is a 'InputTimeout' second'NL)
  1087. call send(' timeout when waiting for your command input. Note that Browse will'NL)
  1088. call send(' terminate after 'MaxTimeouts' timeouts.'NL||NL)
  1089. call getreturn
  1090. call send(' General Help - read this or you will feel like a real dummy!'NL)
  1091. call send(' Type c;e;q to turn off Expert mode for more help, Longer menus'NL)
  1092. call send(' and shorter listings of areas and files.'NL)
  1093. call send(' Use the [M]ark command to mark files for Batch [D]ownload.'NL)
  1094. call send(' Please note that you may only mark up to the current highest'NL)
  1095. call send(' visible at the time. IF you return to the beginning of a list,'NL)
  1096. call send(' higher numbers will not be Markable until you list them once again.'NL||NL)
  1097.  
  1098. call send(' In ALL listings, the RETURN key pages in the current [D]irection'NL)
  1099. call send(' and the prompt indicates the current paging direction.'NL)
  1100. call send(' When the end on a listing is reached, [D]irection is changed to REVERSE'NL)
  1101. call send(' You must change [D]irection to page forward once again.'NL||NL)
  1102.  
  1103. call send(' When [S]earching or listing [N]ew Files, files found are NOT displayed'NL)
  1104. call send(' until the Search or New List is completed. You can STOP the search at'NL)
  1105. call send(' any time with ctl-c. You will then be shown what was found.'NL||NL)
  1106. call getreturn
  1107.  
  1108. call send(' Use the [V]iew command to read a text or to enter an archive as an Area'NL)
  1109. call send(' You can also [V]iew and [M]ark files for download from within an archive'NL||NL)
  1110. call send(' The [D]ownload menu allows you to [U]nmark files from your list,'NL)
  1111. call send(' [C]ontinue marking files, [A]bort, or [D]ownload using either Hydra or Zmodem.'NL)
  1112. call send(' Do not download files one at a time, Browse EXITS after a download.'NL||NL)
  1113.  
  1114. call send(' When a prompt shows one of two choices in UPPERCASE, (Y/n) for example,'NL)
  1115. call send(' the UPPERCASE character is the default choice. The default is executed'NL)
  1116. call send('  if you timeout or enter an unexpected character.'NL||NL) 
  1117. call send(' Commands may be stacked, separated by spaces, commas or semicolons.'NL)
  1118. call send(' A | (vertical bar) will insert a RETURN in the stack.'NL)
  1119. call send(' The Stack is cleared if an invalid command is entered.'NL||NL)
  1120. call getreturn
  1121. call send(' If you just skipped through this, you might as well [E]xit, you will'NL)
  1122. call send(' be just wasting your time NOT being able to use this program.'NL||NL)
  1123. call getreturn
  1124.  
  1125. return
  1126.  
  1127. pushlist:
  1128. return
  1129. /*
  1130. handle=arg(1)
  1131. handle.thelist=thelist
  1132. handle.ltype=ltype
  1133. handle.tagged=tagged
  1134. handle.tag=tag
  1135. handle.display=display
  1136. handle.this_page_offset=this_page_offset
  1137. handle.last_page_offset=last_page_offset
  1138. handle.file_offset=file_offset
  1139. handle.this_page_tags=this_page_tags
  1140. handle.last_page_tags=last_page_tags
  1141. handle.scroll=scroll
  1142. handle.file.tag=file.tag
  1143. handle.bytes.tag=bytes.tag
  1144. handle.seek_offset=seek_offset
  1145. handle.file_offset=file_offset
  1146. call close(handle)
  1147. return
  1148. */
  1149. poplist:
  1150. return
  1151. /*
  1152. handle=arg(1)
  1153. thelist=handle.thelist
  1154. handle=handle.handle
  1155. ltype=handle.ltype
  1156. tagged=handle.tagged
  1157. tag=handle.tag
  1158. display=handle.display
  1159. this_page_offset=handle.this_page_offset
  1160. last_page_offset=handle.last_page_offset
  1161. file_offset=handle.file_offset
  1162. this_page_tags=handle.this_page_tags
  1163. last_page_tags=handle.last_page_tags
  1164. scroll=handle.scroll
  1165. file.tag=handle.file.tag
  1166. bytes.tag=handle.bytes.tag
  1167. seek_offset=handle.seek_offset
  1168. file_offset=handle.file_offset
  1169. call open(handle,thelist,'r')
  1170. call seek(handle,file_offset,'B')
  1171. return
  1172. */
  1173.